package main

import (
	"bytes"
	"flag"
	"fmt"
	"os/exec"
	"strings"
	"time"
)

const DATE_FORMAT = "2006-01-02 15:04:05"

func main() {
	// 定义命令行参数，默认值和描述
	appName := flag.String("appName", "m188_rpa.exe", "要守护的应用程序名称")
	appExePath := flag.String("appExePath", "E:\\m188_rpa\\m188_rpa.exe", "应用程序的完整路径")
	intervalSecs := flag.Int("interval", 5, "检查间隔时间（秒）")

	// 解析命令行参数
	flag.Parse()

	// // 如果没有非标志参数（即除了标志之外的其他参数），打印帮助信息并退出
	// if len(flag.Args()) == 0 && (flag.NFlag() == 0 || *appName == "" || *appExePath == "") {
	// 	flag.Usage()
	// 	return
	// }

	// 将 interval 转换为 time.Duration 类型
	interval := time.Duration(*intervalSecs) * time.Second

	fmt.Println()
	fmt.Println("appName", *appName)
	fmt.Println("appExePath", *appExePath)
	fmt.Println("interval", interval)
	fmt.Println()

	ticker := time.NewTicker(interval)
	defer ticker.Stop()

	for t := range ticker.C {
		fmt.Printf("检查时间: %v\n", t.Format(DATE_FORMAT))
		if !isProcessRunning(*appName) {
			fmt.Printf("%s %s 未运行\n\n", getCurTime(), *appName)
			startProcess(*appExePath)
		} else {
			fmt.Printf("%s %s 正在运行...\n\n", getCurTime(), *appName)
		}
	}
}

// 启动一个新的进程
func startProcess(app string) {
	fmt.Println("启动一个新的进程:", app)
	cmd := exec.Command(app)
	err := cmd.Start()
	if err != nil {
		fmt.Printf("%s 启动程序失败 %s: %v\n", getCurTime(), app, err)
		// TODO 额外处理
	}

	fmt.Println()
}

// 检查给定名称的进程是否正在运行
func isProcessRunning(appName string) bool {
	cmd := exec.Command("tasklist", "/FI", "IMAGENAME eq "+appName)

	var stdout, stderr bytes.Buffer
	cmd.Stdout = &stdout
	cmd.Stderr = &stderr

	err := cmd.Run()
	if err != nil {
		fmt.Printf("%s 检查进程是否正在运行时出错: %v\n", getCurTime(), err)
		fmt.Printf("%s 标准错误输出: %s\n", getCurTime(), stderr.String())
		return false
	}

	// fmt.Printf("%s 标准输出: %s\n", getCurTime(), stdout.String())

	return strings.Contains(stdout.String(), appName)
}

// 获取当前的时间 格式 YYYY-MM-DD HH:mm:ss
func getCurTime() string {
	// 获取当前时间
	now := time.Now()
	return now.Format(DATE_FORMAT)
}
